package easyexcel

import (
	"github.com/xuri/excelize/v2"
	"io"
)

type ReadExcel[T any] interface {

	// SheetName 配置工作簿名称
	SheetName(sheetName string) ReadExcel[T]

	// TimeFormat 配置时间格式化
	TimeFormat(timeFormat string) ReadExcel[T]

	// ReadLocal 从本地文件读取excel，将数据转化为bean列表返回
	ReadLocal(fileName string) []T

	// ReadNet 从网络文件读取excel，将数据转化为bean列表返回
	ReadNet(reader io.Reader) []T
}

type excelToBean[T any] struct {
	*easyExcel[T]
}

// TimeFormat 配置时间格式化
func (tb *excelToBean[T]) TimeFormat(timeFormat string) ReadExcel[T] {
	tb.setTimeFormat(timeFormat)
	return tb
}

// SheetName 配置sheet name
func (tb *excelToBean[T]) SheetName(sheetName string) ReadExcel[T] {
	tb.setSheetName(sheetName)
	return tb
}

// ReadLocal 从本地文件读取excel
func (tb *excelToBean[T]) ReadLocal(fileName string) []T {
	if fileName == "" {
		panic("excel文件名不能为空")
	}

	file, err := excelize.OpenFile(fileName)
	if err != nil {
		panic(err)
	}
	defer func() {
		// 关闭工作簿
		if err := file.Close(); err != nil {
			panic(err)
		}
	}()

	return tb.read(file)
}

// ReadNet 从网络文件读取excel
func (tb *excelToBean[T]) ReadNet(reader io.Reader) []T {
	file, err := excelize.OpenReader(reader)
	if err != nil {
		panic(err)
	}
	defer func() {
		// 关闭工作簿
		if err := file.Close(); err != nil {
			panic(err)
		}
	}()
	return tb.read(file)
}

func (tb *excelToBean[T]) read(file *excelize.File) []T {
	rowsList, err := file.GetRows(tb.sheetName)
	if err != nil {
		panic(err)
	}

	// excel的实际表头信息
	tb.titles = append(tb.titles, rowsList[0]...)

	// 解析excel数据信息
	beans := make([]T, 0, len(rowsList)-1)
	for i := 1; i < len(rowsList); i++ {
		rows := rowsList[i]
		bean := tb.rows2Bean(file, rows, i+1)
		beans = append(beans, bean)
	}
	return beans
}
